Iz09PWlzZmF0YWxwbHVnaW49PT0NCiMgLSotIGNvZGluZzogdXRmLTggLSotDQoNCiMgIGZhdGFs
IHBsdWdpbg0KIyAgd2F0Y2hlcl9wbHVnaW4ucHkNCg0KIyAgQ29weXJpZ2h0IKkgMjAxMCB3ZC9s
b3R1c2ZlZXQgPGRhby95b2dhPg0KDQojICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsg
eW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQ0KIyAgaXQgdW5kZXIgdGhlIHRl
cm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkNCiMg
IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExp
Y2Vuc2UsIG9yDQojICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLg0KDQojICBU
aGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVz
ZWZ1bCwNCiMgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBs
aWVkIHdhcnJhbnR5IG9mDQojICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlDQojICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBm
b3IgbW9yZSBkZXRhaWxzLg0KDQpXQVRDSEVSUyA9IHt9DQoNCmRlZiBpc193YXRjaGVyX2hlcmUo
Z2NoLCBqaWQpOg0KCWlmIEdST1VQQ0hBVFMuaGFzX2tleShnY2gpOg0KCQlnY2hfZGljID0gR1JP
VVBDSEFUU1tnY2hdDQoJCQ0KCQluaWNrbCA9IFtsaSBmb3IgbGkgaW4gZ2NoX2RpYyBpZiBqaWQg
aW4gZ2NoX2RpY1tsaV1bJ2ppZCddIGFuZCBnY2hfZGljW2xpXVsnaXNoZXJlJ10gPT0gMV0NCgkJ
DQoJCWlmIG5pY2tsOg0KCQkJcmV0dXJuIFRydWUNCglyZXR1cm4gRmFsc2UNCg0KZGVmIGhhbmRs
ZXJfd2F0Y2hlcl9wcmVzZW5jZShwcnMpOg0KCXB0eXBlID0gcHJzLmdldFR5cGUoKQ0KCWdyb3Vw
Y2hhdCA9IHBycy5nZXRGcm9tKCkuZ2V0U3RyaXBwZWQoKQ0KCW5pY2sgPSBwcnMuZ2V0RnJvbSgp
LmdldFJlc291cmNlKCkNCglzY29kZSA9IHBycy5nZXRTdGF0dXNDb2RlKCkNCg0KCWlmIHNjb2Rl
ID09ICczMDMnIGFuZCBwdHlwZSA9PSAndW5hdmFpbGFibGUnOg0KCQluZXduaWNrID0gcHJzLmdl
dE5pY2soKQkNCgkJCQkNCgkJamlkID0gZ2V0X3RydWVfamlkKGdyb3VwY2hhdCsnLycrbmV3bmlj
aykNCgkJCQkNCgkJd2djaHMgPSBXQVRDSEVSUy5rZXlzKCkNCgkJDQoJCWZvciB3amlkIGluIHdn
Y2hzOg0KCQkJaWYgbm90IGlzX3dhdGNoZXJfaGVyZShncm91cGNoYXQsd2ppZCk6DQoJCQkJaWYg
Z3JvdXBjaGF0IGluIFdBVENIRVJTW3dqaWRdWydnY2hzJ106DQoJCQkJCXNnY2ggPSBncm91cGNo
YXQuc3BsaXQoJ0AnLDEpWzBdDQoJCQkJCXJlcCA9IHUnWyVzXS0tLSAlcyAoJXMpIGNoYW5nZWQg
aGlzIG5hbWUgdG8gJXMnICUgKHNnY2gsbmljayxqaWQsbmV3bmljaykgDQoJCQ0KCQkJCQltc2co
d2ppZCxyZXApDQoNCmRlZiBoYW5kbGVyX3dhdGNoZXJfbGVhdmUoZ3JvdXBjaGF0LCBuaWNrLCBy
ZWFzb24sIGNvZGUpOg0KCXdnY2hzID0gV0FUQ0hFUlMua2V5cygpDQoJDQoJZm9yIHdqaWQgaW4g
d2djaHM6DQoJCWlmIG5vdCBpc193YXRjaGVyX2hlcmUoZ3JvdXBjaGF0LHdqaWQpOg0KCQkJaWYg
Z3JvdXBjaGF0IGluIFdBVENIRVJTW3dqaWRdWydnY2hzJ106DQoJCQkJc2djaCA9IGdyb3VwY2hh
dC5zcGxpdCgnQCcsMSlbMF0NCgkJCQkNCgkJCQlyZXAgPSB1JycNCgkJCQkNCgkJCQlpZiBjb2Rl
Og0KCQkJCQlpZiBjb2RlID09ICczMDcnOg0KCQkJCQkJcmVwID0gdSdbJXNdLS0tICVzIGtpY2tl
ZCBvdXQgb2YgdGhlIHJvb20nICUgKHNnY2gsbmljaykNCgkJCQkJZWxpZiBjb2RlID09ICczMDEn
Og0KCQkJCQkJcmVwID0gdSdbJXNdLS0tICVzIGhhcyBiZWVuIGJhbm5lZCcgJSAoc2djaCxuaWNr
KQkNCgkJCQllbHNlOg0KCQkJCQlyZXAgPSB1J1slc10tLS0gJXMgbGVhdmVkIHRoZSByb29tJyAl
IChzZ2NoLG5pY2spDQoJCQkJDQoJCQkJaWYgcmVhc29uOg0KCQkJCQlyZXAgKz0gJzogJXMnICUg
KHJlYXNvbikNCgkNCgkJCQltc2cod2ppZCxyZXApDQoNCmRlZiBoYW5kbGVyX3dhdGNoZXJfam9p
bihncm91cGNoYXQsIG5pY2ssIGFmZiwgcm9sZSk6DQoJamlkID0gZ2V0X3RydWVfamlkKGdyb3Vw
Y2hhdCsnLycrbmljaykNCgkNCgl3YWZmID0gJycNCgl3cm9sZSA9ICcnDQoJDQoJd2djaHMgPSBX
QVRDSEVSUy5rZXlzKCkNCgkNCglpZiBhZmYgPT0gJ293bmVyJzoNCgkJd2FmZiA9IHUnb3duZXIn
DQoJZWxpZiBhZmYgPT0gJ21lbWJlcic6DQoJCXdhZmYgPSB1J21lbWJlcicNCgllbGlmIGFmZiA9
PSAnYWRtaW4nOg0KCQl3YWZmID0gdSdhZG1pbicNCgllbGlmIGFmZiA9PSAnbm9uZSc6DQoJCXdh
ZmYgPSB1J25vbmUnDQoJDQoJaWYgcm9sZSA9PSAncGFydGljaXBhbnQnOg0KCQl3cm9sZSA9IHUn
cGFydGljaXBhbnQnDQoJZWxpZiByb2xlID09ICd2aXNpdG9yJzoNCgkJd3JvbGUgPSB1J3Zpc2l0
b3InDQoJZWxpZiByb2xlID09ICdtb2RlcmF0b3InOg0KCQl3cm9sZSA9IHUnbW9kZXJhdG9yJw0K
CQ0KCWZvciB3amlkIGluIHdnY2hzOg0KCQlpZiBub3QgaXNfd2F0Y2hlcl9oZXJlKGdyb3VwY2hh
dCx3amlkKToNCgkJCWlmIGdyb3VwY2hhdCBpbiBXQVRDSEVSU1t3amlkXVsnZ2NocyddOg0KCQkJ
CXNnY2ggPSBncm91cGNoYXQuc3BsaXQoJ0AnLDEpWzBdDQoJCQkJcmVwID0gdSdbJXNdLS0tICVz
ICglcykgam9pbmVkIHRoZSByb29tIGFzICVzLyVzJyAlIChzZ2NoLG5pY2ssamlkLHdhZmYsd3Jv
bGUpIA0KCQkJCW1zZyh3amlkLHJlcCkNCg0KZGVmIGhhbmRsZXJfd2F0Y2hlcl9tZXNzKHR5cGUs
IHNvdXJjZSwgYm9keSk6DQoJZ3JvdXBjaGF0ID0gc291cmNlWzFdDQoJbmljayA9IHNvdXJjZVsy
XQ0KCXdnY2hzID0gV0FUQ0hFUlMua2V5cygpDQoJDQoJZm9yIHdqaWQgaW4gd2djaHM6DQoJCWlm
IG5vdCBpc193YXRjaGVyX2hlcmUoZ3JvdXBjaGF0LHdqaWQpOg0KCQkJaWYgZ3JvdXBjaGF0IGlu
IFdBVENIRVJTW3dqaWRdWydnY2hzJ106DQoJCQkJc2djaCA9IGdyb3VwY2hhdC5zcGxpdCgnQCcs
MSlbMF0NCgkJCQkNCgkJCQlyZXAgPSB1J1slc108JXM+ICVzJyAlIChzZ2NoLG5pY2ssYm9keSkN
CgkJCQkNCgkJCQlzcGxiID0gYm9keS5zcGxpdCgnICcsMSkNCgkJCQkNCgkJCQlpZiBzcGxiOg0K
CQkJCQlpZiBzcGxiWzBdID09ICcvbWUnOg0KCQkJCQkJcmVwID0gdSdbJXNdKiAlcyAlcycgJSAo
c2djaCxuaWNrLHNwbGJbMV0pDQoJCQkJIA0KCQkJCW1zZyh3amlkLHJlcCkNCgkNCmRlZiBoYW5k
bGVyX3dhdGNoZXIodHlwZSwgc291cmNlLCBwYXJhbWV0ZXJzKToNCglncm91cGNoYXQgPSBzb3Vy
Y2VbMV0NCgkNCglpZiB0eXBlID09ICdjb25zb2xlJzoNCgkJamlkID0gJ2NvbnNvbGUnDQoJZWxz
ZToNCgkJamlkID0gZ2V0X3RydWVfamlkKHNvdXJjZSkNCg0KCWlmIEdST1VQQ0hBVFMuaGFzX2tl
eShncm91cGNoYXQpOg0KCQlyZXBseSh0eXBlLCBzb3VyY2UsIHUnVGhpcyBjb21tYW5kIGNhbiBu
b3QgYmUgdXNlZCBpbiBjb25mZXJlbmNlIScpDQoJCXJldHVybg0KDQoJaWYgcGFyYW1ldGVyczoN
CgkJcGFyYW1ldGVycyA9IHBhcmFtZXRlcnMuc3RyaXAoKQ0KCQkNCgkJaWYgcGFyYW1ldGVyc1sw
XSA9PSAnLScgYW5kIGxlbihwYXJhbWV0ZXJzKSA9PSAxOg0KCQkJZGVsIFdBVENIRVJTW2ppZF0N
CgkJCXJlcCA9IHUnaXN0IG9mIGNvbmZlcmVuY2VzIHVuZGVyIG1vbml0b3JpbmcgaXMgY2xlYXJl
ZCwgdGhlIG9ic2VydmF0aW9uIHdpdGhkcmF3biEnDQoJCQlyZXBseSh0eXBlLCBzb3VyY2UscmVw
KQ0KCQllbGlmIHBhcmFtZXRlcnNbMF0gPT0gJy0nIGFuZCBsZW4ocGFyYW1ldGVycykgPiAxIGFu
ZCBwYXJhbWV0ZXJzWzE6XS5pc2RpZ2l0KCk6DQoJCQl3Z2NobiA9IGludChwYXJhbWV0ZXJzWzE6
XSkNCgkJCQ0KCQkJaWYgbm90IFdBVENIRVJTLmhhc19rZXkoamlkKToNCgkJCQlyZXBseSh0eXBl
LCBzb3VyY2UsIHUnTW9uaXRvcmluZyBpcyBub3Qgc2V0dXAhJykNCgkJCWVsc2U6DQoJCQkJd2dj
aHNsID0gV0FUQ0hFUlNbamlkXVsnZ2NocyddDQoJCQkJDQoJCQkJaWYgbGVuKHdnY2hzbCkgPCB3
Z2NobjoNCgkJCQkJcmVwbHkodHlwZSwgc291cmNlLCB1J1dyb25nIG51bWJlciBvZiBjb25mZXJl
bmNlIScpDQoJCQkJZWxzZToNCgkJCQkJd2djaCA9IHdnY2hzbFt3Z2Nobi0xXQ0KCQkJCQlXQVRD
SEVSU1tqaWRdWydnY2hzJ10ucmVtb3ZlKHdnY2gpDQoJCQkJCQ0KCQkJCQlpZiBub3QgV0FUQ0hF
UlNbamlkXVsnZ2NocyddOg0KCQkJCQkJZGVsIFdBVENIRVJTW2ppZF0NCgkJCQkJCQ0KCQkJCQly
ZXAgPSB1J0NvbmZlcmVuY2UgJXMgcmVtb3ZlZCBmcm9tIHRoZSBsaXN0IG9mIGNvbmZlcmVuY2Vz
IHVuZGVyIG1vbml0b3JpbmcsIHN1cnZlaWxsYW5jZSB3aXRoZHJhd24hJyAlICh3Z2NoKQ0KCQkJ
CQkJDQoJCQkJCXJlcGx5KHR5cGUsIHNvdXJjZSxyZXApDQoJCWVsc2U6CQ0KCQkJd2djaCA9IHBh
cmFtZXRlcnMNCgkJCQ0KCQkJaWYgbm90IGNoZWNrX2ppZCh3Z2NoKToNCgkJCQlyZXBseSh0eXBl
LCBzb3VyY2UsdSdJbnZhbGlkIHN5bnRheCEnKQ0KCQkJCXJldHVybg0KCQkJDQoJCQlpZiBub3Qg
V0FUQ0hFUlMuaGFzX2tleShqaWQpOg0KCQkJCVdBVENIRVJTW2ppZF0gPSB7J2djaHMnOltdfQ0K
CQkJDQoJCQlpZiBub3Qgd2djaCBpbiBXQVRDSEVSU1tqaWRdWydnY2hzJ106DQoJCQkJaWYgR1JP
VVBDSEFUUy5oYXNfa2V5KHdnY2gpOg0KCQkJCQlXQVRDSEVSU1tqaWRdWydnY2hzJ10uYXBwZW5k
KHdnY2gpDQoJCQkJCXJlcGx5KHR5cGUsIHNvdXJjZSwgdSdNb25pdG9yaW5nIGZvciBjb25mZXJl
bmNlICVzIHNldHVwIScgJSAod2djaCkpDQoJCQkJZWxzZToNCgkJCQkJaWYgbm90IFdBVENIRVJT
W2ppZF1bJ2djaHMnXToNCgkJCQkJCWRlbCBXQVRDSEVSU1tqaWRdDQoJCQkJCQkNCgkJCQkJcmVw
bHkodHlwZSwgc291cmNlLCB1J1VuYWJsZSB0byBzZXR1cCBtb25pdG9yaW5nLCByZWFzb246IGJv
dCBpcyBub3QgcHJlc2VudCBhdCB0aGlzIGNvbmZlcmVuY2UhJykNCgkJCWVsc2U6DQoJCQkJcmVw
bHkodHlwZSwgc291cmNlLCB1J01vbml0b3Jpbmcgb2YgY29uZmVyZW5jZSBoYXMgZXN0YWJsaXNo
ZWQhJykNCgllbHNlOg0KCQlpZiBXQVRDSEVSUy5oYXNfa2V5KGppZCk6DQoJCQlyZXAgPSB1J0Nv
bmZlcmVuY2UgZm9yIHdoaWNoIHRoZSBlc3RhYmxpc2hlZCBvYnNlcnZhdGlvbiAodG90YWw6ICVk
KTpcblxuJXMnDQoJCQkNCgkJCXdnY2hzbCA9IFdBVENIRVJTW2ppZF1bJ2djaHMnXQ0KCQkJDQoJ
CQl3Z25saSA9IGdldF9udW1fbGlzdCh3Z2Noc2wpDQoJCQkNCgkJCXJlcGx5KHR5cGUsIHNvdXJj
ZSxyZXAgJSAobGVuKHdnY2hzbCksJ1xuJy5qb2luKHdnbmxpKSkpDQoJCWVsc2U6CQ0KCQkJcmVw
bHkodHlwZSwgc291cmNlLCB1J01vbml0b3JpbmcgaXMgbm90IHNldHVwIScpDQoNCnJlZ2lzdGVy
X2NvbW1hbmRfaGFuZGxlcihoYW5kbGVyX3dhdGNoZXIsIENPTU1fUFJFRklYKyd3YXRjaGVyJywg
WydzdXBlcmFkbWluJywnYWxsJywnKiddLCAxMDAsICdBbGxvd3MgeW91IHRvIHJlbW90ZWx5IGlu
IHJlYWwtdGltZSBtb25pdG9yIG90aGVyIGNvbmZlcmVuY2VzIGluIHdoaWNoIHRoZSBib3QsIGku
JiMxMDc3Oy4gZXN0YWJsaXNoZXMgYW4gb2JzZXJ2ZXIuIFdpdGhvdXQgYXJndW1lbnRzIGRpc3Bs
YXlzIGEgbGlzdCBvZiBjb25mZXJlbmNlcyBpbiB3aGljaCB0aGUgb2JzZXJ2ZXIgaXMgc2V0LiBo
ZW4geW91IHNwZWNpZnkgYSBuZWdhdGl2ZSBudW1iZXIgcmVtb3ZlcyB0aGUgY29uZmVyZW5jZSB3
aXRoIHRoaXMgbnVtYmVyIGZyb20gdGhlIGxpc3QgYW5kIHJlbW92ZXMgc3VydmVpbGxhbmNlLics
IENPTU1fUFJFRklYKyd3YXRjaGVyIFs8Y29uZmVyZW5jZT5dfFstPG51bWJlciBmcm9tIHRoZSBs
aXN0Pl0nLCBbQ09NTV9QUkVGSVgrJ3dhdGNoZXInLENPTU1fUFJFRklYKyd3YXRjaGVyIGJvdHpv
bmVAY29uZmVyZW5jZS5qc21hcnQud2ViLmlkJyxDT01NX1BSRUZJWCsnd2F0Y2hlciAtMiddKQ0K
DQpyZWdpc3Rlcl9qb2luX2hhbmRsZXIoaGFuZGxlcl93YXRjaGVyX2pvaW4pDQpyZWdpc3Rlcl9s
ZWF2ZV9oYW5kbGVyKGhhbmRsZXJfd2F0Y2hlcl9sZWF2ZSkNCnJlZ2lzdGVyX3ByZXNlbmNlX2hh
bmRsZXIoaGFuZGxlcl93YXRjaGVyX3ByZXNlbmNlKQ0KcmVnaXN0ZXJfbWVzc2FnZV9oYW5kbGVy
KGhhbmRsZXJfd2F0Y2hlcl9tZXNzKQ==